package com.wp.other;

/**
 * Created by 王萍 on 2017/10/24 0024.
 */

//计算50！阶乘时，若使用int接受结果，会发生溢出，若使用double则会丢失经度。因此需要另外一种计算方式。
//先计算568*18。
public class 大数字运算 {

    public static void main(String[] args) {
        long num1 = 1234564654654646L;
        int num2 = 18;
        System.out.println(getResult(num1, num2));
    }

    /**
     * 1.将大数字转为long[]
     * 2.大数字中的每一位与另一个乘数相乘，将结果存在这位上。
     * 3.从最后一位向前遍历，设每一位上的数字为n，取出非个位数字，留下个位数字，取出的数与前一位的数字相加，循环这样处理直到取出的数字为0。
     */
    private static String getResult(long num1, int num2) {

        StringBuilder result = new StringBuilder("");//非线程安全
        int arrayLength = 30;
        //创建一个较大的int数组，存放运算结果。
        long[] bigNumber = new long[arrayLength];
        int index = arrayLength - 1;
        while (num1 != 0) {
            bigNumber[index--] = num1 % 10;
            num1 /= 10;
        }

        for (int i = 0; i < arrayLength; i++) {
            if (bigNumber[i] != 0) {
                bigNumber[i] *= num2;
            }
        }

        long tmp = 0;
        for (int i = arrayLength - 1; i >= 0; i--) {
            bigNumber[i] += tmp;
            tmp = bigNumber[i] / 10;
            bigNumber[i] = bigNumber[i] % 10;
        }

        int indexOf0 = 0;
        boolean findIndexOf0 = false;
        for (int i = 0; i < arrayLength; i++) {
            if (!findIndexOf0) {
                if (bigNumber[i] != 0) {
                    indexOf0 = i;
                    findIndexOf0 = true;
                }
            }
            result.append(bigNumber[i]);
        }
        return result.substring(indexOf0);
    }
}
